home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 2
/
SPACE - Library 2 - Volume 1.iso
/
program
/
561
/
prolog
/
quiksort
< prev
next >
Wrap
Text File
|
1991-09-08
|
2KB
|
66 lines
% Demonstration für Prolog :
% QUICKSORT -- Sortieren von Listen, deren Elemente Integerzahlen sind
% Quelle : Prolog-Kursus 1985, TH Darmstadt
% (vermutlich mehr oder weniger direkt aus dem Clocksin/Mellish)
% Dieses Beispiel zeigt sehr deutlich, wie man in Prolog Probleme,
% die in anderen Programmiersprachen (wie z.B. Pascal) ziemlich komplex
% werden, auf einfache (einfachste ?) Weise lösen kann.
% Aufruf der Funktion :
% qsort(Unsortierte_Liste, Sortierte_Liste)
%------------------------------------------------------------------------
% Definition des Prädikates 'qsort' :
qsort([], []). % Die leere Liste ist schon sortiert.
qsort([K | R], E) :- % Das erste Element einer nichtleeren Liste wird benutzt,
split(R, K, E1, E2), % ... um die Liste in zwei Teillisten zu spalten,
% von denen E1 die Elemente <= K und E2 die
% Elemente > K enthält.
qsort(E1, S1), % Die beiden Teillisten werden getrennt sortiert.
qsort(E2, S2),
append(S1, [K | S2], E). % Die sortierten Teillisten (und das ehemalige
% erste Element) werden zusammengefügt.
% Definition des Prädikates 'split' :
split([], _, [], []). % Die leere Liste läßt sich nicht spalten.
split([X | R], K, [X | E1], E2) :- X =< K, % Erstes Element <= K :
% einfügen in erste Teilliste.
split(R, K, E1, E2). % Rest der Liste aufspalten.
split([X | R], K, E1, [X | E2]) :- X > K, % Erstes Element > K :
% einfügen in zweite Teilliste.
split(R, K, E1, E2). % Rest der Liste aufspalten.
% Definition des Prädikates 'append' :
append([], L, L) :- !.
append([K | R], L, [K | RL]) :- append(R, L, RL).
%-----------------------------------------------------------------------
% Mit dem folgenden Prädikat kann man die Geschwindigkeit des Sortierens
% prüfen :
% Man ruft statt ' qsort(..., ...) ' das Praädikat ' qtest(..., ...) ' auf.
% 'qtest' gibt unmittelbar VOR und NACH dem Sortieren je ein Klingelzeichen
% aus. Der Abstand der beiden Töne entspricht der benötigten Zeit.
qtest(X, Y) :- bell, qsort(X, Y), bell.
end.